package com.szjz.elasticsearch.eshelper.base.wrapper;

import com.szjz.elasticsearch.eshelper.base.BaseESEntity;
import com.szjz.elasticsearch.eshelper.base.wrapper.service.MapWrapperService;
import com.szjz.elasticsearch.eshelper.page.Page;
import com.szjz.elasticsearch.eshelper.wrapper.ESQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.SearchRequest;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author 史博
 * @desc 实现类
 * @date 2021/2/16 11:58 周二
 */
@Slf4j
@Service
public class MapWrapperServiceImpl<T extends BaseESEntity> extends DayWrapperServiceImpl<T> implements MapWrapperService<T> {


	/**
	 * 通过包装类查询集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @return 数据集合
	 */
	@Override
	public List<Map<String, Object>> selectMap(ESQueryWrapper<T> wrapper) {
		return selectMap(wrapper, SIZE);
	}

	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @return 某一天的数据集合
	 */
	@Override
	public List<Map<String, Object>> selectMap(ESQueryWrapper<T> wrapper, Date date) {
		return selectMap(wrapper, date, SIZE);
	}


	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @return 某一时间段的数据集合
	 */
	@Override
	public List<Map<String, Object>> selectMap(ESQueryWrapper<T> wrapper, Date startDate, Date endDate) {
		return selectMap(wrapper, startDate, endDate, SIZE);
	}

	/**
	 * 通过包装类查询集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param size    返回结果集的最大数量
	 * @return 数据集合
	 */
	@Override
	public List<Map<String, Object>> selectMap(ESQueryWrapper<T> wrapper, Integer size) {
		SearchRequest searchRequest = new SearchRequest(getIndexName());
		return getSelectMaps(wrapper, searchRequest, size);
	}

	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @param size    返回结果集的最大数量
	 * @return 某一天的数据集合
	 */
	@Override
	public List<Map<String, Object>> selectMap(ESQueryWrapper<T> wrapper, Date date, Integer size) {
		SearchRequest searchRequest = new SearchRequest(getIndexName(date));
		return getSelectMaps(wrapper, searchRequest, size);
	}

	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param size      返回结果集的最大数量
	 * @return 某一时间段的数据集合
	 */
	@Override
	public List<Map<String, Object>> selectMap(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer size) {
		SearchRequest searchRequest = getSearchRequestAcDay(startDate, endDate);
		return getSelectMaps(wrapper, searchRequest, size);
	}

	/**
	 * 分页查询-通过包装类查询集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param pageNum  当前页
	 * @param pageSize 每页容量
	 * @return 分页map
	 */
	@Override
	public Page<Map<String, Object>> pageMap(ESQueryWrapper<T> wrapper, Integer pageNum, Integer pageSize) {
		SearchRequest searchRequest = new SearchRequest(getIndexName());
		return getPageMap(wrapper, pageNum, pageSize, searchRequest);
	}

	/**
	 * 分页查询-通过包装类查询集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param indexName 索引库名称
	 * @param pageNum   当前页
	 * @param pageSize  每页容量大小
	 * @return 分页map
	 */
	@Override
	public Page<Map<String, Object>> pageMap(ESQueryWrapper<T> wrapper, String indexName, Integer pageNum, Integer pageSize) {
		SearchRequest searchRequest = new SearchRequest(indexName);
		return getPageMap(wrapper, pageNum, pageSize, searchRequest);
	}

	/**
	 * 分页查询-通过包装类查询集合
	 * 适用于按天分片
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param date     时间
	 * @param pageNum  当前页
	 * @param pageSize 每页容量大小
	 * @return 分页map
	 */
	@Override
	public Page<Map<String, Object>> pageMap(ESQueryWrapper<T> wrapper, Date date, Integer pageNum, Integer pageSize) {
		SearchRequest searchRequest = new SearchRequest(getIndexName(date));
		return getPageMap(wrapper, pageNum, pageSize, searchRequest);
	}

	/**
	 * 分页查询-通过包装类查询集合
	 * 适用于按天分片
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param pageNum   当前页
	 * @param pageSize  每页容量大小
	 * @return 分页map
	 */
	@Override
	public Page<Map<String, Object>> pageMap(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer pageNum, Integer pageSize) {
		SearchRequest searchRequest = getSearchRequestAcDay(startDate, endDate);
		return getPageMap(wrapper, pageNum, pageSize, searchRequest);
	}


}
